package db

import (
	"context"
	"fmt"
	"quant/backend/conf"
	"sync"

	"github.com/redis/go-redis/v9"
	"github.com/sirupsen/logrus"
)

var rdbDaily *redis.Client
var rdbScore *redis.Client
var rdbTest *redis.Client
var rdbTick *redis.Client
var mutRedis sync.Mutex

func GetRedisDaily() *redis.Client {
	mutRedis.Lock()
	defer mutRedis.Unlock()
	if rdbDaily == nil {
		if err := initRedis(); err != nil {
			logrus.Error(err)
			return nil
		}
	}
	return rdbDaily
}

func GetRedisScore() *redis.Client {
	mutRedis.Lock()
	defer mutRedis.Unlock()

	if rdbScore == nil {
		if err := initRedis(); err != nil {
			logrus.Error(err)
			return nil
		}
	}
	return rdbScore
}

func GetRedisTest() *redis.Client {
	mutRedis.Lock()
	defer mutRedis.Unlock()

	if rdbTest == nil {
		if err := initRedis(); err != nil {
			logrus.Error(err)
			return nil
		}
	}
	return rdbTest
}

func GetRedisTick() *redis.Client {
	mutRedis.Lock()
	defer mutRedis.Unlock()

	if rdbTick == nil {
		if err := initRedis(); err != nil {
			logrus.Error(err)
			return nil
		}
	}
	return rdbTick
}

func initRedis() error {
	rdbDaily = redis.NewClient(&redis.Options{
		Addr:     fmt.Sprintf("%s:%d", conf.Config.RedisDaily.Host, conf.Config.RedisDaily.Port), // Redis 服务器地址
		Password: conf.Config.RedisDaily.Password,                                                // 没有密码则留空
		DB:       conf.Config.RedisDaily.Database,                                                // 使用默认数据库
	})

	rdbScore = redis.NewClient(&redis.Options{
		Addr:     fmt.Sprintf("%s:%d", conf.Config.RedisScore.Host, conf.Config.RedisScore.Port), // Redis 服务器地址
		Password: conf.Config.RedisScore.Password,                                                // 没有密码则留空
		DB:       conf.Config.RedisScore.Database,                                                // 使用默认数据库
	})

	rdbTest = redis.NewClient(&redis.Options{
		Addr:     fmt.Sprintf("%s:%d", conf.Config.RedisTest.Host, conf.Config.RedisTest.Port), // Redis 服务器地址
		Password: conf.Config.RedisTest.Password,                                               // 没有密码则留空
		DB:       conf.Config.RedisTest.Database,                                               // 使用默认数据库
	})

	rdbTick = redis.NewClient(&redis.Options{
		Addr:     fmt.Sprintf("%s:%d", conf.Config.RedisTick.Host, conf.Config.RedisTick.Port), // Redis 服务器地址
		Password: conf.Config.RedisTick.Password,                                               // 没有密码则留空
		DB:       conf.Config.RedisTick.Database,                                               // 使用默认数据库
	})

	// 测试连接
	if pong, err := rdbDaily.Ping(context.Background()).Result(); err != nil {
		logrus.
			WithField("HOST", conf.Config.RedisDaily.Host).
			WithField("PORT", conf.Config.RedisDaily.Port).
			Errorf("redis连接失败: %v", err)
		return err
	} else {
		logrus.
			WithField("HOST", conf.Config.RedisDaily.Host).
			WithField("PORT", conf.Config.RedisDaily.Port).
			Infof("Redis连接成功: %v", pong)
		return nil
	}
}
